import 'dart:async';

import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:{{project_name.snakeCase()}}/features/{{feature_name.snakeCase()}}/{{feature_name.snakeCase()}}_spec.dart';
{{#is_cubit}}
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:{{project_name.snakeCase()}}/core/di/injection.dart';
import 'package:{{project_name.snakeCase()}}/features/{{feature_name.snakeCase()}}/presentation/cubit/{{feature_name.snakeCase()}}_cubit.dart';
{{/is_cubit}}
{{#is_riverpod}}
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:{{project_name.snakeCase()}}/features/{{feature_name.snakeCase()}}/presentation/controller/{{feature_name.snakeCase()}}_controller.dart';
{{/is_riverpod}}
{{#is_mobx}}
import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:{{project_name.snakeCase()}}/core/di/injection.dart';
import 'package:{{project_name.snakeCase()}}/features/{{feature_name.snakeCase()}}/presentation/store/{{feature_name.snakeCase()}}_store.dart';
{{/is_mobx}}
import 'package:{{project_name.snakeCase()}}/features/{{feature_name.snakeCase()}}/presentation/cubit/{{feature_name.snakeCase()}}_state.dart';

@RoutePage()
{{#is_cubit}}
class {{feature_name.pascalCase()}}Page extends StatelessWidget {
  const {{feature_name.pascalCase()}}Page({super.key});

  @override
  Widget build(BuildContext context) {
    return BlocProvider(
      create: (_) {
        final cubit = getIt<{{feature_name.pascalCase()}}Cubit>();
        unawaited(cubit.load());
        return cubit;
      },
      child: BlocBuilder<{{feature_name.pascalCase()}}Cubit, {{feature_name.pascalCase()}}State>(
        builder: (context, state) => _{{feature_name.pascalCase()}}View(
          state: state,
          onRetry: () => context.read<{{feature_name.pascalCase()}}Cubit>().load(),
        ),
      ),
    );
  }
}
{{/is_cubit}}
{{#is_riverpod}}
class {{feature_name.pascalCase()}}Page extends ConsumerStatefulWidget {
  const {{feature_name.pascalCase()}}Page({super.key});

  @override
  ConsumerState<{{feature_name.pascalCase()}}Page> createState() =>
      _{{feature_name.pascalCase()}}PageState();
}

class _{{feature_name.pascalCase()}}PageState
    extends ConsumerState<{{feature_name.pascalCase()}}Page> {
  @override
  void initState() {
    super.initState();
    unawaited(
      Future<void>.microtask(
        () =>
            ref.read({{feature_name.camelCase()}}ControllerProvider.notifier).load(),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    final state = ref.watch({{feature_name.camelCase()}}ControllerProvider);
    return _{{feature_name.pascalCase()}}View(
      state: state,
      onRetry: () =>
          ref.read({{feature_name.camelCase()}}ControllerProvider.notifier).load(),
    );
  }
}
{{/is_riverpod}}
{{#is_mobx}}
class {{feature_name.pascalCase()}}Page extends StatefulWidget {
  const {{feature_name.pascalCase()}}Page({super.key});

  @override
  State<{{feature_name.pascalCase()}}Page> createState() =>
      _{{feature_name.pascalCase()}}PageState();
}

class _{{feature_name.pascalCase()}}PageState
    extends State<{{feature_name.pascalCase()}}Page> {
  late final {{feature_name.pascalCase()}}Store _store;

  @override
  void initState() {
    super.initState();
    _store = getIt<{{feature_name.pascalCase()}}Store>();
    unawaited(_store.load());
  }

  @override
  Widget build(BuildContext context) {
    return Observer(
      builder:
          (_) => _{{feature_name.pascalCase()}}View(
            state: _store.state.value,
            onRetry: _store.load,
          ),
    );
  }
}
{{/is_mobx}}

class _{{feature_name.pascalCase()}}View extends StatelessWidget {
  const _{{feature_name.pascalCase()}}View({
    required this.state,
    required this.onRetry,
  });

  final {{feature_name.pascalCase()}}State state;
  final Future<void> Function() onRetry;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text({{feature_name.pascalCase()}}FeatureSpec.title),
      ),
      body: switch (state) {
        {{feature_name.pascalCase()}}Initial() => const SizedBox.shrink(),
        {{feature_name.pascalCase()}}Loading() =>
          const Center(child: CircularProgressIndicator()),
        {{feature_name.pascalCase()}}Loaded(:final items) => _{{feature_name.pascalCase()}}LoadedView(
          items: items,
        ),
        {{feature_name.pascalCase()}}Error(:final message) => Center(
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              Text(message),
              const SizedBox(height: 16),
              ElevatedButton(
                onPressed: onRetry,
                child: const Text('Retry'),
              ),
            ],
          ),
        ),
      },
    );
  }
}

class _{{feature_name.pascalCase()}}LoadedView extends StatelessWidget {
  const _{{feature_name.pascalCase()}}LoadedView({required this.items});

  final List<{{feature_name.pascalCase()}}Entity> items;

  @override
  Widget build(BuildContext context) {
    return ListView(
      padding: const EdgeInsets.all(16),
      children: [
        Card(
          child: Padding(
            padding: const EdgeInsets.all(16),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Text(
                  {{feature_name.pascalCase()}}FeatureSpec.description,
                  style: Theme.of(context).textTheme.bodyLarge,
                ),
                const SizedBox(height: 16),
                _SpecSection(
                  title: 'Acceptance criteria',
                  entries: {{feature_name.pascalCase()}}FeatureSpec.acceptanceCriteria,
                ),
                if ({{feature_name.pascalCase()}}FeatureSpec.edgeCases.isNotEmpty) ...[
                  const SizedBox(height: 16),
                  _SpecSection(
                    title: 'Edge cases',
                    entries: {{feature_name.pascalCase()}}FeatureSpec.edgeCases,
                  ),
                ],
              ],
            ),
          ),
        ),
        const SizedBox(height: 16),
        if (items.isEmpty)
          const Card(
            child: ListTile(
              title: Text('No starter items yet'),
              subtitle: Text(
                'Replace the placeholder repository with a real data source when this feature is implemented.',
              ),
            ),
          )
        else
          ...items.map((item) => ListTile(title: Text(item.name))),
      ],
    );
  }
}

class _SpecSection extends StatelessWidget {
  const _SpecSection({
    required this.title,
    required this.entries,
  });

  final String title;
  final List<String> entries;

  @override
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Text(title, style: Theme.of(context).textTheme.titleMedium),
        const SizedBox(height: 8),
        ...entries.map(
          (entry) => Padding(
            padding: const EdgeInsets.only(bottom: 8),
            child: Row(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                const Padding(
                  padding: EdgeInsets.only(top: 6),
                  child: Icon(Icons.check_circle_outline, size: 18),
                ),
                const SizedBox(width: 8),
                Expanded(child: Text(entry)),
              ],
            ),
          ),
        ),
      ],
    );
  }
}
